package com.mycom.util;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.config.PropertyPlaceholderConfigurer;

import java.util.*;

/**
 * 读取properties工具 请自行配置spring.xml properties
 * 
 * 然后只调用静态工具：
 * String htmlText = PropertiesUtil.getString("**********");
 */
public class PropertiesUtil extends PropertyPlaceholderConfigurer implements Map<String, String>
{
    
    private static final Logger LOGGER = LoggerFactory.getLogger(PropertiesUtil.class);
    private static Map<String, String> ctxPropertiesMap;
    
    public static Map<String, String> getPropertiesMap(){
        return ctxPropertiesMap;
    }

    @Override
    protected void processProperties(ConfigurableListableBeanFactory beanFactoryToProcess, Properties props)
        throws BeansException
    {
        super.processProperties(beanFactoryToProcess, props);
        if (ctxPropertiesMap != null)
        {
            logger.debug("The property map will be override!");
        }
        ctxPropertiesMap = new HashMap<String, String>();
        for (Object key : props.keySet())
        {
            String keyStr = key.toString();
            String value = props.getProperty(keyStr);
            ctxPropertiesMap.put(keyStr, value);
        }
    }
    
    public static String getString(String name)
    {
        if (ctxPropertiesMap == null)
        {
            ctxPropertiesMap = new HashMap<String, String>();
        }
        return (String)ctxPropertiesMap.get(name);
    }
    
    public static boolean getBoolean(String name, boolean defaultValue)
    {
        String v = getString(name);
        if (v == null)
        {
            return defaultValue;
        }
        try
        {
            return Boolean.parseBoolean(v);
        }
        catch (Exception e)
        {
        }
        return defaultValue;
    }
    
    public static int getIntValue(String name, int defaultValue)
    {
        String v = getString(name);
        if (v == null)
        {
            return defaultValue;
        }
        try
        {
            return Integer.parseInt(v);
        }
        catch (Exception e)
        {
        }
        return defaultValue;
    }
    
    public static long getLongValue(String name, long defaultValue)
    {
        String v = getString(name);
        if (v == null)
        {
            return defaultValue;
        }
        try
        {
            return Long.parseLong(v);
        }
        catch (Exception e)
        {
        }
        return defaultValue;
    }
    
    public static short getShortValue(String name, short defaultValue)
    {
        String v = getString(name);
        if (v == null)
        {
            return defaultValue;
        }
        try
        {
            return Short.parseShort(v);
        }
        catch (Exception e)
        {
        }
        return defaultValue;
    }
    
    public static double getDoubleValue(String name, double defaultValue)
    {
        String v = getString(name);
        if (v == null)
        {
            return defaultValue;
        }
        try
        {
            return Double.parseDouble(v);
        }
        catch (Exception e)
        {
        }
        return defaultValue;
    }
    
    public static float getFloatValue(String name, float defaultValue)
    {
        String v = getString(name);
        if (v == null)
        {
            return defaultValue;
        }
        try
        {
            return Float.parseFloat(v);
        }
        catch (Exception e)
        {
        }
        return defaultValue;
    }
    
    @Override
    public int size()
    {
        return ctxPropertiesMap.size();
    }
    
    @Override
    public boolean isEmpty()
    {
        return ctxPropertiesMap.isEmpty();
    }
    
    @Override
    public boolean containsKey(Object key)
    {
        return ctxPropertiesMap.containsKey(key);
    }

    @Override
    public boolean containsValue(Object value)
    {
        throw new UnsupportedOperationException();
    }

    @Override
    public String put(String key, String value)
    {
        throw new UnsupportedOperationException();
    }

    @Override
    public String remove(Object key)
    {
        throw new UnsupportedOperationException();
    }

    @Override
    public void putAll(Map<? extends String, ? extends String> m)
    {
        throw new UnsupportedOperationException();
    }

    @Override
    public void clear()
    {
        throw new UnsupportedOperationException();
    }

    @Override
    public Set<String> keySet()
    {
        throw new UnsupportedOperationException();
    }

    @Override
    public Collection<String> values()
    {
        throw new UnsupportedOperationException();
    }

    @Override
    public Set<Entry<String, String>> entrySet()
    {
        throw new UnsupportedOperationException();
    }

    @Override
    public String get(Object key)
    {
        return (String)ctxPropertiesMap.get(key);
    }
}